package Day_0215.JVM;

/**
 * @author zxc
 * @date 2023/02/15 17:50
 **/
public class Methodarea_PermGen {
    public static void main(String[] args) {
        /**
         * 方法区和永久代之间的区别
         * ===》
         * 1.方法区
         * （1）方法区，属于JVM规范的内容，
         * （2）JVM规范中，方法区主要用于存储类的信息、常量池、方法数据、方法代码等。
         * （3）方法区 是 JVM 的规范，所有虚拟机 必须遵守的。
         *
         * 2.常见的JVM 虚拟机 Hotspot 、 JRockit（Oracle）、J9（IBM）
         *
         * 3.PermGen（永久代）
         * （1）PermGen ， 就是 PermGen space ，全称是 Permanent Generation space ，是指内存的永久保存区域。
         * （2）这块内存主要是被JVM存放Class和Meta信息的， Class 在被 Loader 时就会被放到 PermGen space中。
         *  ===》 绝大部分 Java 程序员应该都见过 java.lang.OutOfMemoryError: PermGen space 这个异常。
         *
         * （3）这里的 PermGen space 其实指的就是 方法区 。
         *  PermGen space 则是 HotSpot 虚拟机 基于 JVM 规范对 方法区 的一个落地实现，
         *  PermGen space 是 HotSpot 虚拟机有，而如 JRockit（Oracle）、J9（IBM） 虚拟机有 方法区 ，但是就没有 PermGen space。
         *  强调： 只有 HotSpot 才有 PermGen space。
         *
         * （4）PermGen space 是 JDK7及之前， HotSpot 虚拟机 对 方法区 的一个落地实现。
         *  HotSpot 也有去永久代的趋势，在 JDK 1.7 中 HotSpot 已经开始了“去永久化”，把原本放在永久代的字符串常量池移出。
         *
         * 4.方法区实现的演变过程 ：
         * （1）JDK6及之前
         *  方法区的实现为永久代，静态变量存放在永久代中，字符串常量池（StringTable）位于运行时常量池中。
         * （2）JDK7
         *  方法区的实现为永久代，但已经逐步“去永久代”，静态变量、字符串常量池移除，保存在堆中;
         * （3）JDK8 方法区的实现为本地内存的元空间，字符串常量池、静态变量仍在堆中;
         *
         * HotSpot 1.7 永久代主要存放常量、类信息、静态变量等数据，与垃圾回收关系不大，新生代和老年代是垃圾回收的主要区域。
         * 永久代 在JDK8被移除, JDK1.8方法区 叫做 元空间：
         * Metaspace（元空间）是 JDK8及之后， HotSpot 虚拟机 对 方法区 的新的实现。
         *
         */
    }
}
